// Package utils 提供通用工具函数
// 该包包含日志、加密等通用功能
package utils

import (
	"fmt"
	"os"
	"path/filepath"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
)

// LoggerConfig 日志配置结构体
type LoggerConfig struct {
	Level    string
	FilePath string
	MaxAge   int
}

// NewLogger 创建新的Zap日志记录器
// 参数:
//
//	config - 日志配置
//
// 返回值:
//
//	*zap.Logger - Zap日志记录器实例
func NewLogger(config LoggerConfig) *zap.Logger {
	// 创建日志目录
	logDir := filepath.Dir(config.FilePath)
	if err := os.MkdirAll(logDir, 0755); err != nil {
		fmt.Printf("Failed to create log directory: %v\n", err)
	}

	// 设置日志级别
	level := zapcore.InfoLevel
	switch config.Level {
	case "debug":
		level = zapcore.DebugLevel
	case "info":
		level = zapcore.InfoLevel
	case "warn":
		level = zapcore.WarnLevel
	case "error":
		level = zapcore.ErrorLevel
	case "dpanic":
		level = zapcore.DPanicLevel
	case "panic":
		level = zapcore.PanicLevel
	case "fatal":
		level = zapcore.FatalLevel
	}

	// 配置编码器
	encoderConfig := zap.NewProductionEncoderConfig()
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
	encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder

	// 配置控制台输出
	consoleEncoder := zapcore.NewConsoleEncoder(encoderConfig)
	consoleCore := zapcore.NewCore(
		consoleEncoder,
		zapcore.AddSync(os.Stdout),
		level,
	)

	// 配置文件输出
	fileEncoder := zapcore.NewJSONEncoder(encoderConfig)
	fileCore := zapcore.NewCore(
		fileEncoder,
		zapcore.AddSync(&lumberjack.Logger{
			Filename:   config.FilePath,
			MaxSize:    100,           // 每个日志文件最大100MB
			MaxAge:     config.MaxAge, // 最多保留30天
			MaxBackups: 30,            // 最多保留30个备份
			Compress:   true,          // 压缩旧日志文件
			LocalTime:  true,          // 使用本地时间命名
		}),
		level,
	)

	// 创建日志记录器，同时输出到控制台和文件
	logger := zap.New(zapcore.NewTee(consoleCore, fileCore), zap.AddCaller(), zap.AddCallerSkip(1))

	return logger
}
